【小ネタ】SQLで複数カラムに対してDISTINCT【Athena/Presto編】
SQL で特定のカラムに対して重複を排除した数を数えたい時
SELECT COUNT(DISTINCT column)
とすればOKです。
では、対象のカラムが複数あるときはどうすればよいでしょうか?
対象のカラムが文字列型の場合、複数カラムを文字列連結させて、擬似的に1カラムとみなすことが考えられます。
SELECT COUNT(DISTINCT column1 || ',' || column2)
この場合、対象のカラムが全て文字列型であるという大前提があるうえ、仮に全て文字列型の場合も、結合によって意図せず一致してしまうこともありえます。
分散 SQL クエリーエンジン Presto では、structural データ型の ROW
型を使うとシンプルにかけます。
SELECT COUNT(DISTINCT ROW(column1, column2))
Presto の structural 型について
Presto には今回紹介した ROW 型を含む3種類の structural 型が存在します。
- ARRAY : ある型の配列
ARRAY[1, 2, 3] => [1, 2, 3]
- MAP :
MAP(ARRAY['foo', 'bar'], ARRAY[1, 2]) => {bar=2, foo=1}
- ROW : SQL 型を並べたもの
CAST(ROW(1, 2.0) AS ROW(x BIGINT, y DOUBLE)) => {x=1, y=2.0}
ROW 型の性質から、DISTINCT した各カラムの型を意識する必要はありません。
ROW 型は Presto 0.148 以降でお試しください。